package network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpEchoServer {
    //要想创建UDP服务器，首先要先打开一个socket文件
    private DatagramSocket socket = null;
    public UdpEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);

    }
    //启动服务器
    public void start() throws IOException {
        System.out.println("启动服务器！");
        while (true){
            //1.读取客户端发来的请求
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
            //2.对请求进行解析，把DatagramPacket转成一个String
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());
            //3.根据请求，处理响应
            String response = process(request);
            //4.把响应构造成DatagramPacket对象
            //构造响应对象要搞清楚对象要发给谁，谁给发的请求，就把响应发给谁
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());
            //5.把这个DatagramPacket对象返回给客户端
            socket.send(responsePacket);
            System.out.printf("[%s:%d] req=%s; resp=%s\n",requestPacket.getAddress().toString(),requestPacket.getPort()
                    ,request,response);


        }

    }

    /**
     * 通过这个方法，实现根据请求计算响应这个过程由于是回显服务器，所以不涉及到其他逻辑 但是如果是其他服务器，就可以在
     * process里面来加上一些其他逻辑的处理
     * @param req
     * @return
     */
    public String process(String req){
        return req;
    }

    public static void main(String[] args) throws IOException {
        //真正启动服务器 端口号：0~65535 ，但是1024以下的端口号系统保留
        UdpEchoServer server = new UdpEchoServer(8000);
        server.start();
    }
}
